package com.twb.netty.handler;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.alibaba.fastjson.JSON;
import com.twb.netty.entity.NettyMessage;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;

public class NettyWebSocketHandler extends SimpleChannelInboundHandler<TextWebSocketFrame> {

	protected static Logger log = LoggerFactory.getLogger(NettyWebSocketHandler.class);
	
	@Override
	protected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame textWebSocketFrame) throws Exception {

		String content = textWebSocketFrame.text();
		
		// 正常的TEXT消息类型
		log.debug("==========【NETTY】接收到的参数【{}】", content);
		
		if(StringUtils.isBlank(content)) {
			return;
		}
		
		NettyMessage message = JSON.parseObject(content, NettyMessage.class);
		
		//处理客户端链接的消息
		switch(message.getType()) {
			case 1:	// 表示连接
				NettyChannelHandlerPool.add(ctx.channel(), message.getAppId());
				
				NettyChannelHandlerPool.add(ctx.channel(), message.getAppIdSenderUserIdGroup());
				
				log.info("==========【NETTY】{}与{}建立了关联", message.getAppIdSenderUserIdGroup(), ctx.channel().id());
				break;
				
			case 2:	// 表示发送消息
				// 将消息存到数据库
				// 查看此好友是否在线，如果在线就将消息发送给此好友
				// 1.根据好友id,查询此通道是否存在
				break;
			
			case 3: // 表示接收消息
				// 将消息设置为已读
				break;
			
			case 4:	// 检测心跳
				log.debug("==========【NETTY】接收到心跳消息【{}】", content);
				break;
			
			default:
				log.error("==========【NETTY】错误消息类型");
				break;
		}
		
	}

	
	/**
	 * 当有新的客户端连接服务器之后,就会自动调用这个方法
	 */
	@Override
	public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
		log.info("==========【NETTY】与客户端建立连接，通道开启！");
		NettyChannelHandlerPool.add(ctx.channel());
	}
	
	
	/**
	 * 当客户端关闭链接时关闭通道
	 */
	@Override
	public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
		log.info("==========【NETTY】与客户端断开连接，通道关闭！");
		NettyChannelHandlerPool.remove(ctx.channel());
	}
	
	
	/**
	 * 出现异常是关闭通道
	 */
	@Override
	public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
		log.info("==========【NETTY】出现异常，通道关闭！");
		NettyChannelHandlerPool.remove(ctx.channel());
	}

}
